class Chat
  def initialize(query)
    @query = query
  end

  def render
    messages = [
      {
        role: 'user',
        content: prompt
      }
    ]
    fetch_completions(messages)
  end

  def prompt
    <<-Markdown.strip_heredoc
    你是一个专家问答系统。始终使用所提供的相关信息回答。
    ## 需要遵循的一些规则: 1. 切勿在答案中直接引用给定的上下文; 2. 避免类似 "根据相关信息，...... "或 "相关信息...... "或 "或任何类似的表述; 3. 如果没有相关信息直接回答不知道。
    ## 相关信息: #{knowledge}
    ## 根据相关信息而不是先验证知识来回答问题。
    ## 问题：#{@query}
    ## 答案：
    Markdown
  end

  # 从FAQ模块中检索最相关的信息
  def knowledge
    embedding = Faq.fetch_embedding(@query)
    faqs = Faq
             .nearest_neighbors(:embedding, embedding, distance: "cosine")
             .limit(3)
    faqs
      .map do |faq|
      "问题：#{faq.question} 答案：#{faq.answer};"
    end.join("\n")
  end

  def fetch_completions(messages)
    url = 'https://api.listenai.com/v1/chat/completions'
    response = HTTPX
                 .plugin(:auth)
                 .bearer_auth(ENV['XINGHUO_API_KEY'])
                 .post(url, json: {
                   temperature: 0.1,
                   messages: messages
                 })
    case response
    in { status: 200, body: body }
      JSON.parse(body).dig('choices', 0, 'message', 'content')
    in {error: error}
      error
    end
  end

end